package me.mingshan.leetcode;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * https://leetcode.cn/problems/sum-of-root-to-leaf-binary-numbers/description/
 * <p>
 * 给出一棵二叉树，其上每个结点的值都是 0 或 1 。每一条从根到叶的路径都代表一个从最高有效位开始的二进制数。
 * <p>
 * 例如，如果路径为 0 -> 1 -> 1 -> 0 -> 1，那么它表示二进制数 01101，也就是 13 。
 * 对树上的每一片叶子，我们都要找出从根到该叶子的路径所表示的数字。
 * <p>
 * 返回这些数字之和。题目数据保证答案是一个 32 位 整数。
 *
 * @author hanjuntao
 * @date 2025/9/3 0003
 */
public class L_1022_从根到叶的二进制之和 {

    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(0);
        root.right = new TreeNode(1);
        root.left.left = new TreeNode(0);
        root.left.right = new TreeNode(1);
        root.right.left = new TreeNode(0);
        root.right.right = new TreeNode(1);

        System.out.println(sumRootToLeaf(root));
    }

    /**
     * dfs 遍历所有路径
     * <p>
     * 在叶子节点处进行计算
     *
     * @param root
     * @return
     */
    public static int sumRootToLeaf(TreeNode root) {
        if (root == null) {
            return 0;
        }

        AtomicInteger result = new AtomicInteger(0);
        dfs(root, "", result);

        return result.get();
    }

    private static void dfs(TreeNode root, String s, AtomicInteger result) {
        if (root == null) {
            return;
        }

        if (s == "") {
            s = String.valueOf(root.val);
        } else {
            s = s + root.val;
        }

        if (root.left == null && root.right == null) {
            int i = Integer.parseInt(s, 2);
            result.addAndGet(i);
            return;
        }

        dfs(root.left, s, result);
        dfs(root.right, s, result);
    }
}
